package Demo01;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * @ClassName Test
 * @Description 上下文关键字---共享数据的子程序/主程序
 * 旨在以函数的形式完成，主要的区别是，各个函数之间不需要通讯，
 * 函数不需要将返回值作为下一个函数的参数
 * @Author 李明忠
 * @Version 1.0
 */
@SuppressWarnings("all")
public class Test {
    //定义集合存放输入的文本
    public static ArrayList<String> initStr;

    //定义一个集合存放循环移动和存放排序后的文本
    public static ArrayList<String> moveStr;
    //1.文本输入
    public static void input(){
        //输入文件路径 text/test.txt
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入文件路径：");
        String filePath = scanner.nextLine();

        //使用文件路径创建文件管道
        //使用try()-catch语句可以使得文件自己关闭资源
        try (
                //创建文件缓冲字符输入流（提高效率）
                BufferedReader br = new BufferedReader(new FileReader(filePath));
        ){
            //业务逻辑

            //创建集合
            initStr = new ArrayList<>();
            //存入每一行
            String line;
            //读入文件并将其存入initStr集合
            while((line = br.readLine()) !=null){
                initStr.add(line);//添加没一行
            }


        } catch (Exception e){
            e.printStackTrace();
        }
    }

    //2.循环移动
    public static void cycMove(){
        //怎么样来实现循环移动？
        /**
         * 现在集合中每一个元素都是一个字符串
         * 1.我先取出字符串
         * 2.将字符串以空格切割成为字符数组
         * 3.将每一个字符数组进行循环移动
         * 4.最后将循环移动后的字符串存入新 的集合moveStr
         */
        //创建moveStr集合用于存放处理后的数据
        moveStr = new ArrayList<>();

        for (int i = 0; i < initStr.size(); i++) {
            //先取出字符串 将字符串以空格切割成为字符数组
            String[] str = initStr.get(i).split(" ");


            /*****************循环移动算法***************/
            //对str中没一个元素进行循环移动
            for (int j = 0; j < str.length; j++) {
                //创建一个中间数组用于暂时存放循环移动后的数据
                //StringBuffer好处是你不用考虑开辟多大而且他有追加函数
                StringBuffer temp = new StringBuffer();
                for (int k = j; k < str.length; k++) {
                    //k控制插入节点
                    temp.append(str[k]).append(" ");
                }
                for (int k = 0; k < j; k++) {
                    temp.append(str[k]).append(" ");
                }
                //最后将这个StringBuffer temp.toString()转为字符串存入到moveStr集合
                moveStr.add(temp.toString());
            }
            /****************************************/
        }
    }

    //3.排序
    public static void strSort(){
        //算法很简单使用冒泡排序对moveStr中的元素进行排序就可以了
        for (int i = 0; i < moveStr.size() - 1; i++) {
            for (int j = 0; j < moveStr.size() - 1 - i; j++) {
                if(moveStr.get(j).compareTo(moveStr.get(j+1)) > 0){
                    String temp = moveStr.get(j);
                    //替换
                    moveStr.set(j,moveStr.get(j+1));
                    moveStr.set(j + 1,temp);
                }
            }
        }
    }

    //4.输出
    public static void output(){
        System.out.println("=========上下文关键字处理结果=========");
        //使用for-each遍历
        for (String s : moveStr){
            System.out.println(s);
        }
        System.out.println("===============end=================");
    }
    public static void main(String[] args) {
        //1.文本输入
        input();
        //2.循环移动
        cycMove();
        //3.排序
        strSort();
        //4.输出
        output();
    }
}
